/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

int get_credit(char sous_titres[30][100], char serie_texte[30][30][DEFAULT_SCREEN_SIZE_X], char serie_couleurs_credits[30][2][20], int nombre_texte_credits[30], int temps_attente_ms[30], int *nombre_sous_titres);
void afficher_bande_titre_credits(char *contenu_titre, char *titre);
void apparition_sous_titre_credits(char sous_titres[30][100], int sous_titre_actuel);
void couleur_noms_speciaux_credits(char serie_contenu_credits[30][30][DEFAULT_SCREEN_SIZE_X], char serie_couleurs_credits[30][2][20], int sous_titre_actuel, int texte_actuel);
void apparition_textes_credits(char serie_contenu_credits[30][30][DEFAULT_SCREEN_SIZE_X], char serie_couleurs_credits[30][2][20], int sous_titre_actuel, int nombre_texte_credits[30], int temps_attente_ms[30]);

/*
**Récupère le contenu des crédits
**Retourne 1 en cas de succès et 0 en cas d'erreur
*/
int get_credit(char sous_titres[30][100], char serie_texte[30][30][DEFAULT_SCREEN_SIZE_X], char serie_couleurs_credits[30][2][20], int nombre_texte_credits[30], int temps_attente_ms[30], int *nombre_sous_titres) {
	long i, j;
	char texte[DEFAULT_SCREEN_SIZE_X], key[50];

	if(fichier_existe("credits.lst")) { //Vérifie l'existance du fichier

		for(i = 0; ini_getsection(i, texte, sizearray(texte), "credits.lst") > 0; i++) { //récupère les section : les sous titres
			strcpy(sous_titres[i], texte); //place le sous titre dans la variable sous_titre
			j = 0;
			nombre_texte_credits[i] = 0;

			while(strcmp(texte, "aap") != 0) { //récupère tous les textes contenu dans le sous_titre
				sprintf(key, "texte%ld", j + 1);
				ini_gets(sous_titres[i], key, "aap", texte, sizearray(texte), "credits.lst");

				if(strcmp(texte, "aap") != 0) {
					strcpy(serie_texte[i][j], texte);
					nombre_texte_credits[i] += 1;
					j++;
				}
			}

			ini_gets(sous_titres[i], "couleur_texte", "Defaut", texte, sizearray(texte), "credits.lst"); //Récupère la couleur d'affichage des textes
			strcpy(serie_couleurs_credits[i][1], texte);
			ini_gets(sous_titres[i], "couleur_fond", "Defaut", texte, sizearray(texte), "credits.lst"); //Récupère la couleur de fond d'affichage des textes (EXPERIMENTALE)
			strcpy(serie_couleurs_credits[i][2], texte);
			temps_attente_ms[i] = ini_getl(sous_titres[i], "temps", -1, "credits.lst"); //Récupère le temps d'attente avant le passage a la liste suivante
			*nombre_sous_titres += 1;
		}
	}
	else {
		return 1;
	}

	if(nombre_sous_titres != 0) {
		return 0;
	}
	else {
		return 1;
	}
}

void afficher_bande_titre_credits(char *contenu_titre, char *titre) {
	move(0, 0);
	afficher_titre(contenu_titre);
	CSLP_Color(COLOR_YELLOW, COLOR_BLUE);
	afficher_centre(titre);
	refresh();
	CSLP_Color(COLOR_WHITE, COLOR_BLACK);
}

void apparition_sous_titre_credits(char sous_titres[30][100], int sous_titre_actuel) {
	int i;

	move(7, 0);
	afficher_sous_titre(sous_titres[sous_titre_actuel], true);
	refresh();
	CSLP_Sleep(50);

	move(6, 0);

	for(i = 0; i != 7; i++) { //Ajoute des ligne et décalle tout vers le bas
		insertln();
		refresh();
		CSLP_Sleep(50);
	}
}

void couleur_noms_speciaux_credits(char serie_contenu_credits[30][30][DEFAULT_SCREEN_SIZE_X], char serie_couleurs_credits[30][2][20], int sous_titre_actuel, int texte_actuel) {

	if(strcmp(serie_couleurs_credits[sous_titre_actuel][1], "Defaut") == 0) {
		CSLP_ColorText(COLOR_WHITE);
	}
	else {
		CSLP_ColorText(couleur_nom(serie_couleurs_credits[sous_titre_actuel][1]));
	}

	if(strcmp(serie_contenu_credits[sous_titre_actuel][texte_actuel], "GAUTHIER") == 0) {
		CSLP_ColorText(COLOR_YELLOW);
	}

	if(strcmp(serie_contenu_credits[sous_titre_actuel][texte_actuel], "BMAUET") == 0) {
		CSLP_ColorText(COLOR_CYAN);
	}

	if(strcmp(serie_contenu_credits[sous_titre_actuel][texte_actuel], "SCHTROUMPFETTE") == 0) {
		CSLP_ColorText(COLOR_BLUE);
	}

	if(strcmp(serie_contenu_credits[sous_titre_actuel][texte_actuel], "MIRCKO") == 0) {
		CSLP_ColorText(COLOR_MAGENTA);
	}

	if(strcmp(serie_contenu_credits[sous_titre_actuel][texte_actuel], "QUENTIN") == 0) {
		CSLP_ColorText(COLOR_RED);
	}

	if(strcmp(serie_couleurs_credits[sous_titre_actuel][2], "Defaut") == 0) {
		CSLP_ColorBG(COLOR_BLACK);
	}
	else {
		CSLP_ColorBG(couleur_nom(serie_couleurs_credits[sous_titre_actuel][2]));
	}

}

void apparition_textes_credits(char serie_contenu_credits[30][30][DEFAULT_SCREEN_SIZE_X], char serie_couleurs_credits[30][2][20], int sous_titre_actuel, int nombre_texte_credits[30], int temps_attente_ms[30]) {
	int texte_actuel, i, j, init, x, x_textes[nombre_texte_credits[sous_titre_actuel]], y = 18, temps_deplacement = 40;
	bool attendre;

	if(nombre_texte_credits[sous_titre_actuel] > 1) { //Si il y a plus d'un texte à afficher
		for(init = 0; init != nombre_texte_credits[sous_titre_actuel]; init++) { //Initialisation de la position de début des textes
			if(init % 2 == 0)
				x_textes[init] = 0;
			else
				x_textes[init] = DEFAULT_SCREEN_SIZE_X - strlen_utf8(serie_contenu_credits[sous_titre_actuel][init]) - 1;
		}
	}

	for(texte_actuel = 0; texte_actuel != nombre_texte_credits[sous_titre_actuel]; texte_actuel++) { //Placement des textes en alternances gauche droite
		if(nombre_texte_credits[sous_titre_actuel] > 1) { //Si il y a plus d'un texte à afficher
			if(texte_actuel % 2 == 0)
				x = 0;
			else
				x = DEFAULT_SCREEN_SIZE_X - strlen_utf8(serie_contenu_credits[sous_titre_actuel][texte_actuel]) - 1;
		}
		else {
			x = x_begin_center(strlen_utf8(serie_contenu_credits[sous_titre_actuel][texte_actuel]));
			y = 39;
		}

		couleur_noms_speciaux_credits(serie_contenu_credits, serie_couleurs_credits, sous_titre_actuel, texte_actuel);
		mvaddstr(y, x, serie_contenu_credits[sous_titre_actuel][texte_actuel]);
		CSLP_ColorBG(COLOR_BLACK);
		refresh();
		y++;
		CSLP_Sleep(50);
	}


	CSLP_Sleep(300); //Attente pour le style xD

	for(j = 0; j != DEFAULT_SCREEN_SIZE_X / 2; j++) { //Centrage des textes
		attendre = false;

		if(nombre_texte_credits[sous_titre_actuel] > 1) {
			y = 18;

			for(texte_actuel = 0; texte_actuel != nombre_texte_credits[sous_titre_actuel]; texte_actuel++) {
				move(y, 0);

				if(texte_actuel % 2 == 0) {
					if(x_textes[texte_actuel] != x_begin_center(strlen_utf8(serie_contenu_credits[sous_titre_actuel][texte_actuel]))) {
						insch(' ');
						x_textes[texte_actuel]++;
						attendre = true;
					}
				}
				else {
					if(x_textes[texte_actuel] != x_begin_center(strlen_utf8(serie_contenu_credits[sous_titre_actuel][texte_actuel]))) {
						delch();
						x_textes[texte_actuel]--;
						attendre = true;
					}
				}

				refresh();
				y++;
			}
		}
		else { //Si il n'y a qu'un texte
			move(18, 0);

			if(y != 19) {
				deleteln();
				refresh();
				y--;
				CSLP_Sleep(20); //Attente suplémentaire car il n'y a pas le même nombre de déplacement à faire
				attendre = true;
			}
		}

		if(attendre) { //Si il y a eu un mouvement : on attend
			CSLP_Sleep(temps_deplacement);

			if(temps_deplacement > 10) {
				temps_deplacement -= 1;
			}
		}
	}

	if(temps_attente_ms[sous_titre_actuel] != -1) {
		CSLP_Sleep(temps_attente_ms[sous_titre_actuel]);
	}
	else {
		CSLP_Sleep(nombre_texte_credits[sous_titre_actuel] * 500); //Plus il y a de textes, plus on attend
	}

	move(6, 0);

	for(i = 0; i != 35; i++) { //Fait disparaître progressivement le texte vers le haut
		deleteln();
		refresh();
		CSLP_Sleep(40);
	}

}

void credit_balayage(void) {
	short caractere = 0, boucle1 = 0, boucle2 = 0, x = 0, y = 0, a = 1, b = DEFAULT_SCREEN_SIZE_X - 1;

	CSLP_ColorText(COLOR_WHITE);

	while(boucle2 != DEFAULT_SCREEN_SIZE_X) {
		while(boucle1 != 3) {
			caractere++;
			if(caractere == 1) {
				CSLP_Color(COLOR_BLACK, COLOR_BLACK);
				mvaddstr(x, y, "♠");
				mvaddstr(a, b, "♠");
			}
			else if(caractere == 2) {
				CSLP_Color(COLOR_RED, COLOR_BLACK);
				mvaddstr(x, y, "♥");
				mvaddstr(a, b, "♥");
			}
			else if(caractere == 3) {
				CSLP_Color(COLOR_RED, COLOR_BLACK);
				mvaddstr(x, y, "♦");
				mvaddstr(a, b, "♦");
			}
			else if(caractere == 4) {
				CSLP_Color(COLOR_YELLOW, COLOR_BLACK);
				mvaddstr(x, y, "☺");
				mvaddstr(a, b, "☺");

			}
			else if(caractere == 5) {
				CSLP_Color(COLOR_GREEN, COLOR_BLACK);
				mvaddstr(x, y, "♣");
				mvaddstr(a, b, "♣");
				caractere = 0;
			}

			x += 2, a += 2;

			boucle1++;
		}

		x = 0, a = 1;

		y++;
		b--;
		boucle2++;
		boucle1 = 0;
		refresh();
		CSLP_Sleep(7);
	}
}
void credit(void) {
	char *contenu_titre = "CREDITS";

	char sous_titres[30][100], serie_contenu_credits[30][30][DEFAULT_SCREEN_SIZE_X], serie_couleurs_credits[30][2][20];
	int sous_titre_actuel, nombre_texte_credits[30], nombre_sous_titres = 0, fin = 0, temps_attente_ms[30], i;
	char titre[100] = "Les jeux indémodables version ";
	strcat(titre, version_jeu);

	play_music(CREDITS);
	music_loop(true);

	clear(); credit_balayage();
	afficher_bande_titre_credits(contenu_titre, titre);

	if(get_credit(sous_titres, serie_contenu_credits, serie_couleurs_credits, nombre_texte_credits, temps_attente_ms, &nombre_sous_titres)) {
		CSLP_ColorText(COL_ERREUR);
		addstr("\n Impossible d'ouvrir la liste des crédits !");
		getch();
		clear();
		return;
	}

	for(sous_titre_actuel = 0; nombre_sous_titres != sous_titre_actuel && fin != 1; sous_titre_actuel++) {

		afficher_bande_titre_credits(contenu_titre, titre);
		if(strcmp("VIDE", sous_titres[sous_titre_actuel])) {
			apparition_sous_titre_credits(sous_titres, sous_titre_actuel);
		}
		apparition_textes_credits(serie_contenu_credits, serie_couleurs_credits, sous_titre_actuel, nombre_texte_credits, temps_attente_ms);

		if(CSLP_PollChar()) { //Vérifie si une touche est pressée
			fin = 1;
		}
	}

	next_music();
	music_loop(false);

	move(0, 0);
	for(i = 0; i != 6; i++) {
		deleteln();
		refresh();
		CSLP_Sleep(100);
	}

}
